package me.desht.scrollingmenusign.commandlets;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
import me.desht.dhutils.Debugger;
import me.desht.dhutils.LogUtils;
import me.desht.scrollingmenusign.DirectoryStructure;
import me.desht.scrollingmenusign.SMSException;
import me.desht.scrollingmenusign.SMSValidate;
import me.desht.scrollingmenusign.ScrollingMenuSign;
import me.desht.scrollingmenusign.views.CommandTrigger;
import me.desht.scrollingmenusign.views.SMSView;
import org.bukkit.command.CommandSender;
public class ScriptCommandlet extends BaseCommandlet {
public ScriptCommandlet() {
super("SCRIPT");
}
@Override
public boolean execute(ScrollingMenuSign plugin, CommandSender sender, CommandTrigger trigger, String cmd, String[] args) {
SMSValidate.isTrue(args.length >= 2, "Usage: " + cmd + " <script-name> [<script-args>]");
ScriptEngineManager manager = new ScriptEngineManager();
String scriptName = args[1];
int idx = scriptName.lastIndexOf('.');
String ext = scriptName.substring(idx + 1);
ScriptEngine engine = manager.getEngineByExtension(ext);
SMSValidate.notNull(engine, "no scripting engine for " + scriptName);
Debugger.getInstance().debug("running script " + scriptName + " with " + engine.getFactory().getEngineName());
Bindings bindings = new SimpleBindings();
if (args.length > 2) {
String[] scriptArgs = new String[args.length - 2];
System.arraycopy(args, 2, scriptArgs, 0, scriptArgs.length);
bindings.put("args", scriptArgs);
} else {
bindings.put("args", new String[0]);
}
bindings.put("view", trigger instanceof SMSView ? trigger : null);
bindings.put("trigger", trigger);
bindings.put("commandSender", sender);
bindings.put("result", true);
File scriptFile = new File(DirectoryStructure.getScriptsFolder(), scriptName);
boolean retval = true;
try {
engine.eval(new BufferedReader(new FileReader(scriptFile)), bindings);
Object o = bindings.get("result");
if (o instanceof Boolean) {
retval = (Boolean) o;
Debugger.getInstance().debug("script " + scriptName + " returns: " + retval);
}
} catch (FileNotFoundException e) {
throw new SMSException("no such script " + scriptName);
} catch (ScriptException e) {
LogUtils.warning("Script " + scriptName + " encountered an error:");
LogUtils.warning(" " + e.getMessage());
throw new SMSException("script encountered an error (see server log)");
}
return retval;
}
}